﻿#include "FITKWidgetSciNotation.h"

#include <QTimer>
#include <QHelpEvent>
#include <QToolTip>
#include <QMessageBox>

namespace Core
{
    FITKWidgetSciNotation::FITKWidgetSciNotation(QWidget* parent) :
        QLineEdit(parent) 
    {
        setAttribute(Qt::WA_AlwaysShowToolTips);
        //文本编辑控件编辑完成信号连接
        connect(this, SIGNAL(editingFinished()), this, SLOT(slot_textChanged()));

        connect(this, &FITKWidgetSciNotation::textEdited, this, &FITKWidgetSciNotation::slot_textEdited);
        connect(this, &FITKWidgetSciNotation::textChanged, this, &FITKWidgetSciNotation::slot_textEdited);
    }

    FITKWidgetSciNotation::~FITKWidgetSciNotation()
    {

    }

    void FITKWidgetSciNotation::setValue(double val)
    {
        // 保存数值。
        _value = val;
        _currentValidText = QString::number(_value);

        // 更新文本。
        disconnect(this, &FITKWidgetSciNotation::textChanged, this, &FITKWidgetSciNotation::slot_textEdited);
        setText(QString("%1").arg(val));
        connect(this, &FITKWidgetSciNotation::textChanged, this, &FITKWidgetSciNotation::slot_textEdited);
    }

    double FITKWidgetSciNotation::value()
    {
        return _value;
    }

//    void FITKWidgetSciNotation::setUnit(QString u)
//    {
//        _unit = u;
//    }
//    QString FITKWidgetSciNotation::getUnit()
//    {
//        return _unit;
//    }

    void FITKWidgetSciNotation::setRange(double* range)
    {
        _range[0] = range[0];
        _range[1] = range[1];
    }

    bool FITKWidgetSciNotation::isValidText(QString message, double & value)
    {
        bool result = {};
        //判断是否为空
        if (message.isEmpty())return false;

//        // 提取数值部分
//        QString numberPart = extractNumberPart(message);
//        result = numberPart.toDouble(&result);

//        if (result) {
//            value = numberPart.toDouble();
//            return true;
//        }
//        return false;
        //获取第一个字符串
        QString firstChart = message.mid(0, 1);
        
        //判断数据是否为负数，qstring::toDouble不支持负数
        if (firstChart == "-"){
            QString stringData = message.remove(0, 1);
            stringData.toDouble(&result);
            if (result == true){
                double doubleData = stringData.toDouble();
                //数据取反
                value = doubleData * (-1);
                return true;
            }
            else{
                return false;
            }
        }
        else{
            message.toDouble(&result);
            if (result == true){
                value = message.toDouble(&result);
                return true;
            }
            else{
                return false;
            }
        }
    }

    QString FITKWidgetSciNotation::getCurrentValidText()
    {
        return _currentValidText;
    }

    bool FITKWidgetSciNotation::getCurrentValidValue(double & value)
    {
        return isValidText(_currentValidText, value);
    }
    //这个地方修改了
    void FITKWidgetSciNotation::setCurrentValidValue(double value,QString unit)
    {
        _currentValidText = QString::number(value);
        setText(_currentValidText+unit);// 数值和单位组合
    }

    void FITKWidgetSciNotation::slot_textChanged()
    {
        bool result = true;
        double value;
        //判断文本是否是有效的科学计数法

        result = isValidText(this->text(), value);
        if (result == true){
            //判断数据是否超出范围
            if (value < _range[0] || value>_range[1]) {
                QMessageBox::warning(this, "Warning", QString("Value Range:%1-%2").arg(_range[0]).arg(_range[1]));
                this->setText(_currentValidText);
                return;
            }
            _currentValidText = this->text();
            emit dataChanged();
        }
        else{
            this->setText(_currentValidText);
        }
    }

    void FITKWidgetSciNotation::slot_textEdited(const QString & text)
    {
        // 在文本编辑后，分离数值和单位
        //QString numberPart = extractNumberPart(text);
        //_value = numberPart.toDouble();
        // 提取单位部分（可以通过类似的方法实现）
        //QString unitPart = extractUnitPart(text);
        //_unit = unitPart;
        _value = text.toDouble();
    }

    // 提取数值部分
    QString FITKWidgetSciNotation::extractNumberPart(const QString &text)
    {
        QString numberPart = text;

        // 查找单位的开始位置（例如，查找数字后面的空格或字母等）
        int unitStartIndex = text.indexOf(QRegExp("[^0-9\\.]"));

        // 如果找到了单位部分，截取数值部分
        if (unitStartIndex != -1) {
            numberPart = text.left(unitStartIndex).trimmed();  // 提取数值部分并去掉空格
        }

        return numberPart;
    }

    // 提取单位部分
    QString FITKWidgetSciNotation::extractUnitPart(const QString &text)
    {
        QString unitPart;

        // 查找单位的开始位置（例如，查找字母）
        int unitStartIndex = text.indexOf(QRegExp("[A-Za-z]"));

        // 如果找到了单位部分
        if (unitStartIndex != -1) {
            unitPart = text.mid(unitStartIndex).trimmed();  // 提取单位部分
        }

        return unitPart;
    }
}
